面试总结(19/10/16)
面试总结
- Q: 对于面向对象的理解,面向对象与面向过程的区别。
A: 简单来说,面向对象是一种以“对象”为中心的编程思想,把要解决的问题分解成对象,建立的对象是为了描述它在整个解决问题的过程中的属性和行为,面型对象的核心是继承和多态,将问题转化成对象的过程叫做‘抽象’。
面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。
- Q: 单例模式与静态类的区别。
A:
- 单例模式是最简单的设计模式之一,属于创建型模式,它提供了一种创建对象的方式,确保只有单个对象被创建。这个设计模式主要目的是想在整个系统中只能出现类的一个实例,即一个类只有一个对象。 单例模式的解决的痛点就是节约资源,节省时间
从两个方面看:
1.由于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级的对象而言,是很重要的.
2.因为不需要频繁创建对象,我们的GC压力也减轻了,而在GC中会有STW(stop the world),从这一方面也节约了GC的时间 单例模式的缺点:简单的单例模式设计开发都比较简单,但是复杂的单例模式需要考虑线程安全等并发问题,引入了部分复杂度。- 静态类就是一个类里面都是静态方法和静态field,构造器被private修饰,因此不能被实例化。Math类就是一个静态类。
- 写代码当中,这两者都很常见,单例模式和静态类都能保证对象在全局只有一个实体。但是面试的时候,面试官往往会问,单例模式比静态类有哪些好处呢?为什么要使用单例模式呢?他们两者都可以是线程安全的。
1.单例模式是可以继承其他类或者实现其他接口的,而静态类不行。所以单例模式的扩展性更加好。
2.单例模式是有状态的,而静态类是无状态的。这样的话,单例模式就更加符合面向对象的思想。
3.单例对象在对象第一次使用的时候才进行实例化,将实例化延后是为了避免类加载后实例使用前内存的浪费。而静静态方法的类会在代码编译的时候就被加载。单例模式储存在heap(堆区)而静态类储存在栈区。[1]
- 单例模式常见实现方法
1
2
3
4
5
6
7
8
//饿汉模式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//双重检查(DCL)
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
- Q: 线程池概念,如何手写一个线程池。
A: 优点
- 重用线程池中的线程,避免因为线程的创建和销毁带来的性能开销。
- 有效控制线程的最大并发数,避免因大量的线程之间互相抢占系统资源而导致的阻塞 。
- 能够对线程进行简单的管理,并提供定时执行和执行循环间隔执行等功能
1
2
3
4
5
6
7
8
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) { }
规则 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
今日思考: 关系型和非关系型数据库使用场景?